package mcp

import "encoding/json"

// JSONRPCVersion JSON-RPC协议版本
const JSONRPCVersion = "2.0"

// JSONRPCRequest JSON-RPC请求结构
type JSONRPCRequest struct {
	JSONRPC string          `json:"jsonrpc"`
	ID      interface{}     `json:"id,omitempty"`
	Method  string          `json:"method"`
	Params  json.RawMessage `json:"params,omitempty"`
}

// JSONRPCResponse JSON-RPC响应结构
type JSONRPCResponse struct {
	JSONRPC string      `json:"jsonrpc"`
	ID      interface{} `json:"id,omitempty"`
	Result  interface{} `json:"result,omitempty"`
	Error   *RPCError   `json:"error,omitempty"`
}

// JSONRPCNotification JSON-RPC通知结构（无需响应）
type JSONRPCNotification struct {
	JSONRPC string          `json:"jsonrpc"`
	Method  string          `json:"method"`
	Params  json.RawMessage `json:"params,omitempty"`
}

// RPCError JSON-RPC错误结构
type RPCError struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Data    interface{} `json:"data,omitempty"`
}

// 标准JSON-RPC错误代码
const (
	ParseError     = -32700 // 解析错误
	InvalidRequest = -32600 // 无效请求
	MethodNotFound = -32601 // 方法未找到
	InvalidParams  = -32602 // 无效参数
	InternalError  = -32603 // 内部错误
)

// MCP协议特定类型

// InitializeRequest 初始化请求
type InitializeRequest struct {
	ProtocolVersion string                 `json:"protocolVersion"`
	Capabilities    ClientCapabilities     `json:"capabilities"`
	ClientInfo      ClientInfo             `json:"clientInfo"`
	Meta            map[string]interface{} `json:"meta,omitempty"`
}

// InitializeResponse 初始化响应
type InitializeResponse struct {
	ProtocolVersion string             `json:"protocolVersion"`
	Capabilities    ServerCapabilities `json:"capabilities"`
	ServerInfo      ServerInfo         `json:"serverInfo"`
}

// ClientCapabilities 客户端能力
type ClientCapabilities struct {
	Experimental map[string]interface{} `json:"experimental,omitempty"`
	Sampling     map[string]interface{} `json:"sampling,omitempty"`
}

// ServerCapabilities 服务器能力
type ServerCapabilities struct {
	Logging      *LoggingCapability      `json:"logging,omitempty"`
	Prompts      *PromptsCapability      `json:"prompts,omitempty"`
	Resources    *ResourcesCapability    `json:"resources,omitempty"`
	Tools        *ToolsCapability        `json:"tools,omitempty"`
	Experimental map[string]interface{}  `json:"experimental,omitempty"`
}

// LoggingCapability 日志能力
type LoggingCapability struct{}

// PromptsCapability 提示能力
type PromptsCapability struct {
	ListChanged bool `json:"listChanged,omitempty"`
}

// ResourcesCapability 资源能力
type ResourcesCapability struct {
	Subscribe   bool `json:"subscribe,omitempty"`
	ListChanged bool `json:"listChanged,omitempty"`
}

// ToolsCapability 工具能力
type ToolsCapability struct {
	ListChanged bool `json:"listChanged,omitempty"`
}

// ClientInfo 客户端信息
type ClientInfo struct {
	Name    string `json:"name"`
	Version string `json:"version"`
}

// ServerInfo 服务器信息
type ServerInfo struct {
	Name    string `json:"name"`
	Version string `json:"version"`
}

// Tool 工具定义
type Tool struct {
	Name        string                 `json:"name"`
	Description string                 `json:"description,omitempty"`
	InputSchema map[string]interface{} `json:"inputSchema"`
}

// ToolsListRequest 工具列表请求
type ToolsListRequest struct {
	Cursor string `json:"cursor,omitempty"`
}

// ToolsListResponse 工具列表响应
type ToolsListResponse struct {
	Tools      []Tool  `json:"tools"`
	NextCursor *string `json:"nextCursor,omitempty"`
}

// ToolsCallRequest 工具调用请求
type ToolsCallRequest struct {
	Name      string                 `json:"name"`
	Arguments map[string]interface{} `json:"arguments,omitempty"`
}

// ToolsCallResponse 工具调用响应
type ToolsCallResponse struct {
	Content []Content `json:"content"`
	IsError bool      `json:"isError,omitempty"`
}

// Content 内容结构
type Content struct {
	Type string `json:"type"`
	Text string `json:"text,omitempty"`
}

// LoggingLevel 日志级别
type LoggingLevel string

const (
	LoggingLevelDebug   LoggingLevel = "debug"
	LoggingLevelInfo    LoggingLevel = "info"
	LoggingLevelNotice  LoggingLevel = "notice"
	LoggingLevelWarning LoggingLevel = "warning"
	LoggingLevelError   LoggingLevel = "error"
	LoggingLevelCritical LoggingLevel = "critical"
	LoggingLevelAlert   LoggingLevel = "alert"
	LoggingLevelEmergency LoggingLevel = "emergency"
)

// LoggingMessage 日志消息
type LoggingMessage struct {
	Level  LoggingLevel `json:"level"`
	Data   interface{}  `json:"data,omitempty"`
	Logger string       `json:"logger,omitempty"`
}

// PingRequest ping请求
type PingRequest struct{}

// PongResponse pong响应
type PongResponse struct{}